package com.mouchina.admin.base.rewrite;

import com.mouchina.admin.base.listener.FileUploadProgressListener;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

public class CustomMultipartResolver
    extends CommonsMultipartResolver
{
    @Resource
    private FileUploadProgressListener progressListener;

    @Override
    @SuppressWarnings( "unchecked" )
    public MultipartParsingResult parseRequest( HttpServletRequest request )
                                        throws MultipartException
    {
        String encoding = determineEncoding( request );
        FileUpload fileUpload = prepareFileUpload( encoding );
        progressListener.setSession( request.getSession(  ) );
        fileUpload.setProgressListener( progressListener );

        try
        {
            List<FileItem> fileItems = ( (ServletFileUpload) fileUpload ).parseRequest( request );

            return parseFileItems( fileItems, encoding );
        } catch ( FileUploadBase.SizeLimitExceededException ex )
        {
            throw new MaxUploadSizeExceededException( fileUpload.getSizeMax(  ), ex );
        } catch ( FileUploadException ex )
        {
            throw new MultipartException( "Could not parse multipart servlet request", ex );
        }
    }
}
